package com.gec.anan.rules.config;

import lombok.extern.slf4j.Slf4j;
import org.kie.api.KieServices;
import org.kie.api.builder.KieBuilder;
import org.kie.api.builder.KieFileSystem;
import org.kie.api.builder.KieModule;
import org.kie.api.runtime.KieContainer;
import org.kie.internal.io.ResourceFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Slf4j
@Configuration
public class DroolsConfig {

    /**
     * KieContainer 类在 Drools（一个开源业务规则管理系统）中扮演着至关重要的角色。
     * 主要功能：
     * 加载 Kie 模块：KieContainer 提供了 newKieSession() 和 newKieSessionConfiguration() 方法来加载 Kie 模块并创建 Kie 会话。
     * 创建 Kie 会话：KieContainer 提供了创建 Kie 会话的工厂方法，允许应用程序与业务逻辑交互。
     * **管理 Kie 会话：**KieContainer 允许应用程序启动、终止和销毁 Kie 会话，从而控制业务逻辑的执行。
     * 获取 Kie 模块：KieContainer 提供了获取 Kie 模块的方法，例如 getKieModule()，以便应用程序可以访问规则和流程定义。
     * 释放资源：KieContainer 提供了 dispose() 方法来释放与 Kie 模块和 Kie 会话关联的所有资源。
     */

    // 制定规则文件的路径
    private static final String RULES_CUSTOMER_RULES_DRL = "rules/FeeRule.drl";

    @Bean
    public KieContainer kieContainer() {
        KieServices kieServices = KieServices.Factory.get();

        KieFileSystem kieFileSystem = kieServices.newKieFileSystem();
        kieFileSystem.write(ResourceFactory.newClassPathResource(RULES_CUSTOMER_RULES_DRL));
        KieBuilder kb = kieServices.newKieBuilder(kieFileSystem);
        kb.buildAll();

        KieModule kieModule = kb.getKieModule();
        KieContainer kieContainer = kieServices.newKieContainer(kieModule.getReleaseId());
        return kieContainer;
    }
}